/*Obtener PAUSE Y CLS de MS-DOS en Linux:
1 - hacer un script llamado pause con - nano pause - con el siguiente contenido:
#!/bin/bash
echo "Pulse enter para continuar..."
read -n 0 -ers
2 - editar .bashrc - nano cls - agregar la siguiente linea
#!/bin/bash
clear
Luego darle permisos con:
chmod +x pause cls
Y copiarlos a /usr/bin - cp pause cls /usr/bin
*/

/* DECLARACION DE LIBRERIAS QUE SE VAN A UTILIZAR */
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

/* ESTA CONSTANTE ESPECIFICA LA CANTIDAD DE LUGARES CON LAS QUE VA A TRABAJAR EL PROGRAMA */
#define M 3
/* REEMPLAZO DE fflush() */
/*
# LIBERAR EL BUFFER DE ENTRADA ESTANDAR CON GLIBC DE SOLARIS
include <stdio_ext.h>
__fpurge(stdin);
O SI NO DIFINIENDO ESTA CONSTANTE
*/
#define FLUSH  while(getchar() != '\n')


/* ESTRUCTURA DE LOS DATOS QUE VOY A USAR */
struct modelo
	 {
	 char codigo[5], descripcion[30];
	 float precio;
	 int stock;
	 };
int main ()
	 {

	 /* DECLARACIOM DE VARIABLES */
	 int i, opc1=9, modificar=9;
	 struct modelo datos[M];
	 char tempchar[30];
	 float tempfloat;

	 /* PUESTA EN CERO DEL VECTOR DE CODIGOS */
	 for(i=0;i<M;i++)
		  {
		  strcpy(datos[i].codigo, "0000");
		  }


	 /* MENU PRINCIPAL */
	 while (opc1!=5)
		  {
		  system("cls");
		  printf("Menu principal\n");
		  printf("--------------\n");
		  printf("1 - Alta\n");
		  printf("2 - Baja\n");
		  printf("3 - Muestra en pantalla\n");
		  printf("4 - Modificacion\n");
		  printf("5 - Salir\n");
		  printf("Elija opcion: ");
		  /* LEE OPCION*/
		  scanf("%d", &opc1);
		  switch (opc1)
				{



				/* OPCION ALTA DE PRODUCTOS*/
				case 1:
					 system("cls");
					 printf("ALTA DE ARTICULOS\n");
					 printf("-----------------\n");

					 /* BUSCA UN LUGAR VACIO PARA GUARDAR*/
					 for(i=0;i<M;i++)
						  {
						  if(strcmp(datos[i].codigo, "0000")==0)
								{

								/* INGRESA CODIGO */
								printf("Ingrese codigo: ");
								scanf("%s", datos[i].codigo);

								/* VALIDA CODIGO */
								while (strlen(datos[i].codigo)!=4)
									 {
									 printf("Reingrese codigo (4 caracteres): ");
									 scanf("%s", datos[i].codigo);
									 }

								/* INGRESA DESCRIPCION */
								printf("Ingrese Descripcion: ");
								FLUSH;
								//fgets(datos[i].descripcion,sizeof(datos[i].descripcion),stdin);
								gets(datos[i].descripcion);

								/*VALIDA DESCRIPCION */
								while (strlen(datos[i].descripcion)<1 || strlen(datos[i].descripcion)>30)
									 {
									 printf("\nReingrese descripcion, maximo 30: ");
									 FLUSH;
									 gets(datos[i].descripcion);
									 }

								/* INGRESA PRECIO */
								printf("Ingrese Precio: ");
								scanf("%f", &tempfloat);
								datos[i].precio=tempfloat;

								/* INGRESA STOCK */
								printf("Ingrese Stock: ");
								scanf("%d", &datos[i].stock);
								break;
								}
						  }

						  /* SI RECORRE TODO EL VECTOR DICE SI NO QUEDA ESPACIO O SI FUE GUARDADO*/
						  if(i==M)
								{
								printf("No queda memoria suficiente para seguir guardar datos\n");
								}
								else
								{
								printf("\nEl dato fue guardado exitosamente");
								}
					 printf("\nPresione ENTER para continuar...");
					 system("pause");
					 break;



				/* OPCION QUE DA DE BAJA UN ARTICULO */
				case 2:
					 system("cls");
					 printf("BAJA DE ARTICULOS\n");
					 printf("-----------------\n");

					 /* INGRESA CODIGO */
					 printf("Ingrese codigo del articulo que quiere dar de baja: ");
					 FLUSH;
					 gets(tempchar);

					 /*VALIDA CODIGO A DAR DE BAJA A LA TERCERA VEZ VUELVE A MENU PRINCIPAL*/
					 while (strlen(tempchar)!=4)
						{
						printf("Reingrese codigo que quiere dar de baja (rango 4): ");
						FLUSH;
						gets(tempchar);
						}

					 /* BUSCA EN EL VECTOR SI LO ENCUENTRA PONE CODIGO A CERO*/
					 for(i=0;i<M;i++)
						  {
						  if(strcmp(tempchar, datos[i].codigo)==0)
								{
								strcpy(datos[i].codigo, "0000");
								break;
								}
						  }

						  /* COMPRUEBA SI RECCORIO TODO EL VECTOR NO LO ENCONTRO, SINO YA ESTA BORRADO*/
						  if (i==M)
								{
								printf("\nCodigo de articulo no encontrado.");
								}
								else
								{
								printf("\nArticulo borrado exitosamente");
								}

					 printf("\nPresione ENTER para continuar...");
					 system("pause");
					 break;




				/* OPCION MUESTRA EN PANTALLA */
				case 3:
					 system("cls");
					 printf("LISTADO DE ARTICULOS\n");
					 printf("--------------------\n");
					 printf("Codigo  Descripcion                   Precio  Stock\n");
					 printf("------  ----------------------------  ------  -----\n");

					 /* LISTA TODO EL VECTOR CON SUS DISTINTOS TIPOS DE DATOS (EL -29 ES PARA QUE LOS CARACTERES SE PONGAN A LA IZQUIERDA)*/
					 for(i=0;i<M;i++)
							{
							if(strcmp(datos[i].codigo, "0000")!= 0)
								{
								printf("%6s  %-29s %6.2f %6d\n", datos[i].codigo, datos[i].descripcion, datos[i].precio, datos[i].stock);
								}
							}
					 printf("\nPresiones ENTER para continuar...");
					 system("pause");
					 break;



				/* OPCION DE MODIFICACION DE ARTICULOS */
				case 4:
					 system("cls");
					 printf("MODIFICACION DE ARTICULOS\n");
					 printf("-------------------------\n");

					 /* INGRESAS EL CODIGO A MODIFICAR */
					 printf("Ingrese codigo de articulo: ");
					 FLUSH;
					 gets(tempchar);

					 /* VALIDA */
					 while (strlen(tempchar)!=4)
						{
						printf("Reingrese codigo (4 caracteres): ");
						FLUSH;
						gets(tempchar);
						}

					 /* RECORRE TODO EL VECTOR EN SU BUSQUEDA */
					 for(i=0;i<M;i++)
						  {
						  if(strcmp(tempchar, datos[i].codigo)==0)
								{
								system("cls");

								/* MUESRTA SUBMENU DE OPCIONES */
								printf("MODIFICAR ARTICULO numero %s\n", tempchar);
								printf("------------------------------\n");
								printf("1 - Modificar descripcion (Actualmente: %s)\n", datos[i].descripcion);
								printf("2 - Modificar precio (Actualmente: %.2f)\n", datos[i].precio);
								printf("3 - Modificar Stock (Actualmente: %d)\n", datos[i].stock);
								printf("4 - Volver al menu principal\n");
								printf("Elija opcion: ");

								/* LEE LA OPCION SELECCIONADA */
								scanf("%d", &modificar);
								switch(modificar)
									{
									case 1:
										system("cls");

										/* INGRESA NUEVA DESCRIPCION */
										printf("Ingrese nueva descripcion: ");
										FLUSH;
										gets(tempchar);

										/* LA VALIDA */
										while(strlen(tempchar)<1 || strlen(tempchar)>29)
											{
											printf("Reingrese nueva descripcion (valor maximo 29 caracteres): ");
											FLUSH;
											gets(tempchar);
											}
										/* LE ASIGNA EL NUEVO VALOR */
										strcpy(datos[i].descripcion, tempchar);
										printf("%s a sido asignado exitosamente.", datos[i].descripcion);
										system("pause");
										break;

									case 2:
										system("cls");

										/* LEE NUEVO PRECIO Y LO ASIGNA */
										printf("Ingrese nueva precio: ");
										scanf("%f", &tempfloat);
										datos[i].precio=tempfloat;
										printf("%s ahora vale %.2f.", datos[i].descripcion, datos[i].precio);
										system("pause");
										break;
									case 3:
										system("cls");

										/* LEE NUEVO PRECIO Y LO ASIGNA */
										printf("Ingrese nueva cantidad de stock: ");
										scanf("%d", &datos[i].stock);
										printf("%s ahora tiene %d articulos en el sistema.",datos[i].descripcion, datos[i].stock);
										system("pause");
										break;
									case 4:
										system("cls");
										break;
									}
								break;
								}
						  }

						  /* SI NO ENCONTRO EL CODIGO MUESTRA UNA LEYENDA */
						  if (i==M)
								{
								printf("\nCodigo de articulo no encontrado.");
								}

					 printf("\nPresione ENTER para continuar...");
					 system("pause");
					 break;
				case 5:
					 system("cls");
					 printf("Fin del programa");
					 system("pause");
					 break;
				default:
					 printf("Opcion incorrecta");
					 system("pause");
					 break;
				}
		  }
	return 0;
	 }

